using Sage.CloudStorage.Qiniu.Cdn;
using Sage.CloudStorage.Qiniu.Config;
using Sage.CloudStorage.Qiniu.Models;
using Sage.CloudStorage.Qiniu.Storage;
using Sage.Http.Core;

namespace Sage.CloudStorage.Qiniu
{
    /// <summary>
    /// 七牛云客户端 - 统一访问入口
    /// </summary>
    /// <remarks>
    /// 这是Sage.Qiniu库的主要入口点，提供对七牛云所有服务的访问。
    /// 客户端采用模块化设计，每个功能领域由专门的管理器类处理。
    /// </remarks>
    public class QiniuClient : IDisposable, IAsyncDisposable
    {
        private readonly HttpRequestManager _httpManager;
        private readonly QiniuConfig _config;
        private readonly QiniuKey _key;
        private bool _disposed = false;

        #region 服务管理器

        /// <summary>
        /// 存储管理器 - 提供对象存储相关功能
        /// </summary>
        public BucketManager Bucket { get; }

        /// <summary>
        /// 上传管理器 - 提供文件上传功能
        /// </summary>
        public UploadManager Upload { get; }

        /// <summary>
        /// 下载管理器 - 提供文件下载功能
        /// </summary>
        public DownloadManager Download { get; }

        /// <summary>
        /// CDN管理器 - 提供CDN加速相关功能
        /// </summary>
        public CdnManager Cdn { get; }

        /// <summary>
        /// 数据处理管理器 - 提供数据处理相关功能
        /// </summary>
        public OperationManager Operation { get; }

        #endregion

        // 移除了无法正常使用的构造函数，请直接使用带有 HttpRequestManager 参数的构造函数

        /// <summary>
        /// 创建七牛云客户端实例（使用自定义的HttpRequestManager）
        /// </summary>
        /// <param name="accessKey">访问密钥</param>
        /// <param name="secretKey">安全密钥</param>
        /// <param name="httpManager">自定义的HTTP请求管理器</param>
        /// <param name="config">配置选项（可选）</param>
        public QiniuClient(string accessKey, string secretKey, HttpRequestManager httpManager, QiniuConfig? config = null)
        {
            if (string.IsNullOrEmpty(accessKey))
                throw new ArgumentNullException(nameof(accessKey));

            if (string.IsNullOrEmpty(secretKey))
                throw new ArgumentNullException(nameof(secretKey));

            _key = new QiniuKey(accessKey, secretKey);
            _config = config ?? new QiniuConfig();
            _httpManager = httpManager ?? throw new ArgumentNullException(nameof(httpManager));

            // 初始化各个管理器
            Bucket = new BucketManager(_httpManager, _key, _config);
            Upload = new UploadManager(_httpManager, _key, _config);
            Download = new DownloadManager(_httpManager, _key);
            Cdn = new CdnManager(_httpManager, _key, _config);
            Operation = new OperationManager(_httpManager, _key, _config);
        }

        /// <summary>
        /// 释放资源
        /// </summary>
        public void Dispose()
        {
            if (_disposed)
                return;

            _disposed = true;
            GC.SuppressFinalize(this);
        }

        /// <summary>
        /// 异步释放资源
        /// </summary>
        public async ValueTask DisposeAsync()
        {
            if (_disposed)
                return;

            _disposed = true;
            GC.SuppressFinalize(this);
            await Task.CompletedTask;
        }
    }
}